﻿/*
 Copyright (c) 2003-2013, CKSource - Frederico Knabben. All rights reserved.
 For licensing, see LICENSE.md or http://ckeditor.com/license
*/
(function() {
    function y(c) { return c.type == CKEDITOR.NODE_TEXT && 0 < c.getLength() && (!o || !c.isReadOnly()) }

    function s(c) {
        return!(c.type == CKEDITOR.NODE_ELEMENT &&
            c.isBlockBoundary(CKEDITOR.tools.extend({}, CKEDITOR.dtd.$empty, CKEDITOR.dtd.$nonEditable)))
    }

    var o,
        t = function() {
            return{
                textNode: this.textNode,
                offset: this.offset,
                character: this.textNode ? this.textNode.getText().charAt(this.offset) : null,
                hitMatchBoundary: this._.matchBoundary
            }
        },
        u = ["find", "replace"],
        p = [
            ["txtFindFind", "txtFindReplace"], [
                "txtFindCaseChk",
                "txtReplaceCaseChk"
            ], ["txtFindWordChk", "txtReplaceWordChk"], ["txtFindCyclic", "txtReplaceCyclic"]
        ],
        n = function(c, g) {
            function n(a, b) {
                var d = c.createRange();
                d.setStart(a.textNode, b ? a.offset : a.offset + 1);
                d.setEndAt(c.editable(), CKEDITOR.POSITION_BEFORE_END);
                return d
            }

            function q(a) {
                var b = c.getSelection(), d = c.editable();
                b && !a
                    ? (a = b.getRanges()[0].clone(), a.collapse(!0))
                    : (a = c.createRange(), a.setStartAt(d, CKEDITOR.POSITION_AFTER_START));
                a.setEndAt(d, CKEDITOR.POSITION_BEFORE_END);
                return a
            }

            var v = new CKEDITOR.style(CKEDITOR.tools.extend({
                        attributes: { "data-cke-highlight": 1 },
                        fullMatch: 1,
                        ignoreReadonly: 1,
                        childRule: function() { return 0 }
                    },
                    c.config.find_highlight,
                    !0)),
                l = function(a, b) {
                    var d = this, c = new CKEDITOR.dom.walker(a);
                    c.guard = b ? s : function(a) { !s(a) && (d._.matchBoundary = !0) };
                    c.evaluator = y;
                    c.breakOnFalse = 1;
                    a.startContainer.type == CKEDITOR.NODE_TEXT &&
                        (this.textNode = a.startContainer, this.offset = a.startOffset - 1);
                    this._ = { matchWord: b, walker: c, matchBoundary: !1 }
                };
            l.prototype = {
                next: function() { return this.move() },
                back: function() { return this.move(!0) },
                move: function(a) {
                    var b = this.textNode;
                    if (null === b) return t.call(this);
                    this._.matchBoundary = !1;
                    if (b && a && 0 < this.offset) this.offset--;
                    else if (b && this.offset < b.getLength() - 1) this.offset++;
                    else {
                        for (b = null;
                            !b &&
                                !(b = this._.walker[a ? "previous" : "next"].call(this._.walker),
                                    this._.matchWord && !b ||
                                        this._.walker._.end);
                        );
                        this.offset = (this.textNode = b) ? a ? b.getLength() - 1 : 0 : 0
                    }
                    return t.call(this)
                }
            };
            var r = function(a, b) {
                this._ = { walker: a, cursors: [], rangeLength: b, highlightRange: null, isMatched: 0 }
            };
            r.prototype = {
                toDomRange: function() {
                    var a = c.createRange(), b = this._.cursors;
                    if (1 > b.length) {
                        var d = this._.walker.textNode;
                        if (d) a.setStartAfter(d);
                        else return null
                    } else
                        d = b[0], b =
                            b[b.length - 1], a.setStart(d.textNode, d.offset), a.setEnd(b.textNode, b.offset + 1);
                    return a
                },
                updateFromDomRange: function(a) {
                    var b = new l(a);
                    this._.cursors = [];
                    do a = b.next(), a.character && this._.cursors.push(a);
                    while (a.character);
                    this._.rangeLength = this._.cursors.length
                },
                setMatched: function() { this._.isMatched = !0 },
                clearMatched: function() { this._.isMatched = !1 },
                isMatched: function() { return this._.isMatched },
                highlight: function() {
                    if (!(1 >
                        this._.cursors.length)) {
                        this._.highlightRange && this.removeHighlight();
                        var a = this.toDomRange(), b = a.createBookmark();
                        v.applyToRange(a);
                        a.moveToBookmark(b);
                        this._.highlightRange = a;
                        b = a.startContainer;
                        b.type != CKEDITOR.NODE_ELEMENT && (b = b.getParent());
                        b.scrollIntoView();
                        this.updateFromDomRange(a)
                    }
                },
                removeHighlight: function() {
                    if (this._.highlightRange) {
                        var a = this._.highlightRange.createBookmark();
                        v.removeFromRange(this._.highlightRange);
                        this._.highlightRange.moveToBookmark(a);
                        this.updateFromDomRange(this._.highlightRange);
                        this._.highlightRange = null
                    }
                },
                isReadOnly: function() {
                    return!this._.highlightRange ? 0 : this._.highlightRange.startContainer.isReadOnly()
                },
                moveBack: function() {
                    var a = this._.walker.back(), b = this._.cursors;
                    a.hitMatchBoundary && (this._.cursors = b = []);
                    b.unshift(a);
                    b.length > this._.rangeLength && b.pop();
                    return a
                },
                moveNext: function() {
                    var a = this._.walker.next(), b = this._.cursors;
                    a.hitMatchBoundary && (this._.cursors = b = []);
                    b.push(a);
                    b.length > this._.rangeLength && b.shift();
                    return a
                },
                getEndCharacter: function() {
                    var a = this._.cursors;
                    return 1 > a.length ? null : a[a.length - 1].character
                },
                getNextCharacterRange: function(a) {
                    var b, d;
                    d = this._.cursors;
                    d = (b = d[d.length - 1]) && b.textNode ? new l(n(b)) : this._.walker;
                    return new r(d, a)
                },
                getCursors: function() { return this._.cursors }
            };
            var w = function(a, b) {
                var d = [-1];
                b && (a = a.toLowerCase());
                for (var c = 0; c < a.length; c++)
                    for (d.push(d[c] + 1); 0 < d[c + 1] && a.charAt(c) != a.charAt(d[c + 1] - 1);)
                        d[c + 1] = d[d[c + 1] - 1] + 1;
                this._ = { overlap: d, state: 0, ignoreCase: !!b, pattern: a }
            };
            w.prototype = {
                feedCharacter: function(a) {
                    for (this._.ignoreCase &&
                            (a = a.toLowerCase());;
                    ) {
                        if (a == this._.pattern.charAt(this._.state))
                            return this._.state++, this._.state == this._.pattern.length ? (this._.state = 0, 2) : 1;
                        if (this._.state) this._.state = this._.overlap[this._.state];
                        else return 0
                    }
                    return null
                },
                reset: function() { this._.state = 0 }
            };
            var z = /[.,"'?!;: \u0085\u00a0\u1680\u280e\u2028\u2029\u202f\u205f\u3000]/,
                x = function(a) {
                    if (!a) return!0;
                    var b = a.charCodeAt(0);
                    return 9 <= b && 13 >= b || 8192 <= b && 8202 >= b || z.test(a)
                },
                e = {
                    searchRange: null,
                    matchRange: null,
                    find: function(a, b, d, f, e, A) {
                        this.matchRange
                            ? (this.matchRange.removeHighlight(), this.matchRange =
                                this.matchRange.getNextCharacterRange(a.length))
                            : this.matchRange = new r(new l(this.searchRange), a.length);
                        for (var i = new w(a, !b), j = 0, k = "%"; null !== k;) {
                            for (this.matchRange.moveNext(); k = this.matchRange.getEndCharacter();) {
                                j = i.feedCharacter(k);
                                if (2 == j) break;
                                this.matchRange.moveNext().hitMatchBoundary && i.reset()
                            }
                            if (2 == j) {
                                if (d) {
                                    var h = this.matchRange.getCursors(),
                                        m = h[h.length - 1],
                                        h = h[0],
                                        g = c.createRange();
                                    g.setStartAt(c.editable(), CKEDITOR.POSITION_AFTER_START);
                                    g.setEnd(h.textNode, h.offset);
                                    h = g;
                                    m = n(m);
                                    h.trim();
                                    m.trim();
                                    h = new l(h, !0);
                                    m = new l(m, !0);
                                    if (!x(h.back().character) || !x(m.next().character)) continue
                                }
                                this.matchRange.setMatched();
                                !1 !== e && this.matchRange.highlight();
                                return!0
                            }
                        }
                        this.matchRange.clearMatched();
                        this.matchRange.removeHighlight();
                        return f && !A
                            ? (this.searchRange = q(1), this.matchRange =
                                null, arguments.callee.apply(this, Array.prototype.slice.call(arguments).concat([!0])))
                            : !1
                    },
                    replaceCounter: 0,
                    replace: function(a, b, d, f, e, g, i) {
                        o = 1;
                        a = 0;
                        if (this.matchRange &&
                            this.matchRange.isMatched() &&
                            !this.matchRange._.isReplaced &&
                            !this.matchRange.isReadOnly()) {
                            this.matchRange.removeHighlight();
                            b = this.matchRange.toDomRange();
                            d = c.document.createText(d);
                            if (!i) {
                                var j = c.getSelection();
                                j.selectRanges([b]);
                                c.fire("saveSnapshot")
                            }
                            b.deleteContents();
                            b.insertNode(d);
                            i || (j.selectRanges([b]), c.fire("saveSnapshot"));
                            this.matchRange.updateFromDomRange(b);
                            i || this.matchRange.highlight();
                            this.matchRange._.isReplaced = !0;
                            this.replaceCounter++;
                            a = 1
                        } else a = this.find(b, f, e, g, !i);
                        o = 0;
                        return a
                    }
                },
                f = c.lang.find;
            return{
                title: f.title,
                resizable: CKEDITOR.DIALOG_RESIZE_NONE,
                minWidth: 350,
                minHeight: 170,
                buttons: [CKEDITOR.dialog.cancelButton(c, { label: c.lang.common.close })],
                contents: [
                    {
                        id: "find",
                        label: f.find,
                        title: f.find,
                        accessKey: "",
                        elements: [
                            {
                                type: "hbox",
                                widths: ["230px", "90px"],
                                children: [
                                    {
                                        type: "text",
                                        id: "txtFindFind",
                                        label: f.findWhat,
                                        isChanged: !1,
                                        labelLayout: "horizontal",
                                        accessKey: "F"
                                    }, {
                                        type: "button",
                                        id: "btnFind",
                                        align: "left",
                                        style: "width:100%",
                                        label: f.find,
                                        onClick: function() {
                                            var a = this.getDialog();
                                            e.find(a.getValueOf("find", "txtFindFind"),
                                                    a.getValueOf("find", "txtFindCaseChk"),
                                                    a.getValueOf("find", "txtFindWordChk"),
                                                    a.getValueOf("find", "txtFindCyclic")) ||
                                                alert(f.notFoundMsg)
                                        }
                                    }
                                ]
                            }, {
                                type: "fieldset",
                                label: CKEDITOR.tools.htmlEncode(f.findOptions),
                                style: "margin-top:29px",
                                children: [
                                    {
                                        type: "vbox",
                                        padding: 0,
                                        children: [
                                            {
                                                type: "checkbox",
                                                id: "txtFindCaseChk",
                                                isChanged: !1,
                                                label: f.matchCase
                                            },
                                            {
                                                type: "checkbox",
                                                id: "txtFindWordChk",
                                                isChanged: !1,
                                                label: f.matchWord
                                            }, {
                                                type: "checkbox",
                                                id: "txtFindCyclic",
                                                isChanged: !1,
                                                "default": !0,
                                                label: f.matchCyclic
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }, {
                        id: "replace",
                        label: f.replace,
                        accessKey: "M",
                        elements: [
                            {
                                type: "hbox",
                                widths: ["230px", "90px"],
                                children: [
                                    {
                                        type: "text",
                                        id: "txtFindReplace",
                                        label: f.findWhat,
                                        isChanged: !1,
                                        labelLayout: "horizontal",
                                        accessKey: "F"
                                    }, {
                                        type: "button",
                                        id: "btnFindReplace",
                                        align: "left",
                                        style: "width:100%",
                                        label: f.replace,
                                        onClick: function() {
                                            var a = this.getDialog();
                                            e.replace(a,
                                                    a.getValueOf("replace", "txtFindReplace"),
                                                    a.getValueOf("replace", "txtReplace"),
                                                    a.getValueOf("replace", "txtReplaceCaseChk"),
                                                    a.getValueOf("replace",
                                                        "txtReplaceWordChk"),
                                                    a.getValueOf("replace", "txtReplaceCyclic")) ||
                                                alert(f.notFoundMsg)
                                        }
                                    }
                                ]
                            }, {
                                type: "hbox",
                                widths: ["230px", "90px"],
                                children: [
                                    {
                                        type: "text",
                                        id: "txtReplace",
                                        label: f.replaceWith,
                                        isChanged: !1,
                                        labelLayout: "horizontal",
                                        accessKey: "R"
                                    }, {
                                        type: "button",
                                        id: "btnReplaceAll",
                                        align: "left",
                                        style: "width:100%",
                                        label: f.replaceAll,
                                        isChanged: !1,
                                        onClick: function() {
                                            var a = this.getDialog();
                                            e.replaceCounter = 0;
                                            e.searchRange = q(1);
                                            e.matchRange && (e.matchRange.removeHighlight(), e.matchRange = null);
                                            for (c.fire("saveSnapshot");
                                                e.replace(a,
                                                    a.getValueOf("replace", "txtFindReplace"),
                                                    a.getValueOf("replace", "txtReplace"),
                                                    a.getValueOf("replace", "txtReplaceCaseChk"),
                                                    a.getValueOf("replace", "txtReplaceWordChk"),
                                                    !1,
                                                    !0);
                                            );
                                            e.replaceCounter
                                                ? (alert(f.replaceSuccessMsg.replace(/%1/, e.replaceCounter)), c.fire(
                                                    "saveSnapshot"))
                                                : alert(f.notFoundMsg)
                                        }
                                    }
                                ]
                            }, {
                                type: "fieldset",
                                label: CKEDITOR.tools.htmlEncode(f.findOptions),
                                children: [
                                    {
                                        type: "vbox",
                                        padding: 0,
                                        children: [
                                            {
                                                type: "checkbox",
                                                id: "txtReplaceCaseChk",
                                                isChanged: !1,
                                                label: f.matchCase
                                            }, {
                                                type: "checkbox",
                                                id: "txtReplaceWordChk",
                                                isChanged: !1,
                                                label: f.matchWord
                                            },
                                            {
                                                type: "checkbox",
                                                id: "txtReplaceCyclic",
                                                isChanged: !1,
                                                "default": !0,
                                                label: f.matchCyclic
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                ],
                onLoad: function() {
                    var a = this, b, c = 0;
                    this.on("hide", function() { c = 0 });
                    this.on("show", function() { c = 1 });
                    this.selectPage = CKEDITOR.tools.override(this.selectPage,
                        function(f) {
                            return function(e) {
                                f.call(a, e);
                                var g = a._.tabs[e], i;
                                i = "find" === e ? "txtFindWordChk" : "txtReplaceWordChk";
                                b = a.getContentElement(e, "find" === e ? "txtFindFind" : "txtFindReplace");
                                a.getContentElement(e, i);
                                g.initialized ||
                                (CKEDITOR.document.getById(b._.inputId),
                                    g.initialized = !0);
                                if (c) {
                                    var j, e = "find" === e ? 1 : 0, g = 1 - e, k, h = p.length;
                                    for (k = 0; k < h; k++)
                                        i = this.getContentElement(u[e], p[k][e]), j =
                                            this.getContentElement(u[g], p[k][g]), j.setValue(i.getValue())
                                }
                            }
                        })
                },
                onShow: function() {
                    e.searchRange = q();
                    var a = this.getParentEditor().getSelection().getSelectedText(),
                        b = this.getContentElement(g, "find" == g ? "txtFindFind" : "txtFindReplace");
                    b.setValue(a);
                    b.select();
                    this.selectPage(g);
                    this[("find" == g && this._.editor.readOnly ? "hide" : "show") + "Page"]("replace")
                },
                onHide: function() {
                    var a;
                    e.matchRange &&
                        e.matchRange.isMatched() &&
                        (e.matchRange.removeHighlight(), c.focus(), (a = e.matchRange.toDomRange()) &&
                            c.getSelection().selectRanges([a]));
                    delete e.matchRange
                },
                onFocus: function() {
                    return"replace" == g
                        ? this.getContentElement("replace", "txtFindReplace")
                        : this.getContentElement("find", "txtFindFind")
                }
            }
        };
    CKEDITOR.dialog.add("find", function(c) { return n(c, "find") });
    CKEDITOR.dialog.add("replace", function(c) { return n(c, "replace") })
})();
